package com.example.d2_reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;

/**
 * 目标：掌握获取类的构造器,并对其进行操作
 */
public class Test2Constructor {
    // 获取全部构造器
    @Test
    public void testGetConstructors() {
        // 1.反射第一步：必须先得到这个类的Class对象
        Class c = Cat.class;

        // 2.获取类的全部构造器
        // 这种方式可以获取到所有的构造器不管是不是私有的
        Constructor[] constructors = c.getDeclaredConstructors();

        // 这种方式只能获取到public的构造器,私有的构造器是获取不到的
        // Constructor[] constructors = c.getConstructors();
        // 3.遍历数组中的每个构造器对象
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName() + constructor.getParameterCount());
        }
    }

    // 获取单个构造器
    @Test
    public void testGetConstructor() throws Exception {
        // 1.反射第一步：必须先得到这个类的Class对象
        Class c = Cat.class;

        // 2.获取无参数构造器
        // 这种只能获取到public的构造器,私有的构造器是获取不到的
        Constructor constructor1 = c.getDeclaredConstructor();
        System.out.println(constructor1.getName() + constructor1.getParameterCount());
        constructor1.setAccessible(true); // 暴力反射
        Cat cat = (Cat) constructor1.newInstance();
        System.out.println(cat);

        // 3.获取有参数构造器
        Constructor constructor2 = c.getDeclaredConstructor(String.class, int.class);
        System.out.println(constructor2.getName() + constructor2.getParameterCount());
        // 默认情况下私有的构造器是不能被访问的
        constructor2.setAccessible(true); // 暴力反射
        Cat cat1 = (Cat) constructor2.newInstance("yu", 1);
        System.out.println(cat1);
    }
}